from django.db import models
from django.conf import settings

from gongyequ import choices


class SurveyItem(models.Model):
    """项目问卷"""
    # 名称
    name = models.TextField(verbose_name='工业园区名称', blank=True)
    # 城市 用于计算路网密度
    city = models.TextField(verbose_name='城市', blank=True)
    # 工业园区地址
    address = models.JSONField()
    # 拓展半径范围 数值在500-2000内 单位：m
    radius = models.PositiveIntegerField(null=True)
    # 评估模式
    mode = models.TextField(blank=True)

    # 基础设施现况【多选】，数据结构：[{'水通':true},{'电通':true},....]
    infrastructure = models.JSONField(null=True)

    # 路网密段，数据结构：[{'主干路':'800km'},{'次干路':'800km'}，{'支路':'800km'},'files':[{'url':'xx/xx.jog'}]...]
    network = models.JSONField(null=True)

    # 内部网络多样性,结构同路网密段
    internal_network = models.JSONField(null=True)

    # 工业区各项环境安全度指标
    # 包含以下内容：城市环境、土壤环境、大气环境、水环境、声环境、光环境、热环境
    # 数据格式：{'光环境安全度':'一星级'，'热环境安全度':'一星级'，'files':[{'url':'xx/xx/xx.jpg','filename':'xx.jog'}].....}
    env_safety = models.JSONField(null=True)

    # 房屋质量安全度
    # 包含以下内容：结构安全性、沉溺程度、使用状况
    # 数据格式，如：{'结构安全性':'完好'，'沉溺程度':'均匀沉降'，'files':[{'url':'xx/xx/xx.jpg','filename':'xx.jog'}].....}
    house_safety = models.JSONField(null=True)

    # 室内空气安全度
    # 包含以下内容：有毒有害气体、总挥发性有机物含量、可吸入颗粒物含量
    # 数据格式，如：{'有毒有害气体':'基本无'，'files':[{'url':'xx/xx/xx.jpg','filename':'xx.jog'}].....}
    indoor_safety = models.JSONField(null=True)

    # 标记是否删除
    is_active = models.BooleanField(default=False)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def serialize_list(self):
        data = dict(
            id=self.id,
            name=self.name,
            city=self.city,
            address=self.address,
            radius=self.radius,
            mode=self.mode,
            note=self.approval.note,
            status=self.approval.status,
            created_at=self.created_at,
            updated_at=self.updated_at,
        )

        return data

    def serialize_detail(self):
        data_list = []
        for file in self.survey.all():
            data_list.append(file.serialize())

        data = dict(
            **self.serialize_list(),
            network=self.network,
            infrastructure=self.infrastructure,
            internal_network=self.internal_network,
            env_safety=self.env_safety,
            house_safety=self.house_safety,
            indoor_safety=self.indoor_safety,
        )

        data['photos'] = data_list

        return data


class SurveyItemFile(models.Model):
    """项目图片
    """
    # 所属项目
    survey = models.ForeignKey(
        'SurveyItem',
        null=True,
        on_delete=models.CASCADE,
        related_name='survey'
    )
    # 文件路径
    file = models.TextField(blank=True)
    # 文件名
    filename = models.TextField(blank=True)

    def serialize(self):
        data = dict(
            url=self.file,
            filename=self.filename,
        )

        return data


class SurveyItemApproval(models.Model):
    """审核
    """
    # 审核者 只有 admin 才有权限
    approver = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        null=True,
        on_delete=models.SET_NULL,
        verbose_name='审核人',
        related_name='+'
    )

    # 被审核的项目
    survey = models.OneToOneField(
        'SurveyItem',
        null=True,
        on_delete=models.CASCADE,
        related_name='approval'
    )

    # 审核时间
    approved_at = models.DateTimeField(null=True, verbose_name='审核时间')
    # 备注，用于审核不通过时需填写的原因
    note = models.TextField(blank=True, verbose_name='备注')
    # 审核状态,分为四种：待审核、审核不通过、评估中(在生成报告中并且已经是审核通过的)、评估完成
    STATUS = choices.SurveyItemApproval.APPROVAL_STATUS
    status = models.IntegerField(choices=STATUS.choices, default=STATUS.pending, verbose_name='审核')

    updated_at = models.DateTimeField(auto_now=True)


class SurveyItemUser(models.Model):
    """
    用户和项目关系表
    """
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='+')

    # 项目
    survey = models.ForeignKey(
        'SurveyItem',
        on_delete=models.CASCADE,
        related_name='+'
    )

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def serialize(self):
        data = dict(
            id=self.id,
            user=self.user.username,
            survey=self.survey.serialize_list(),
        )

        return data
